package at.ac.tuwien.ifs.calendit.basis.gui;

import java.util.List;

import javax.swing.table.AbstractTableModel;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

import at.ac.tuwien.ifs.calendit.basis.helper.Constants;
import at.ac.tuwien.ifs.calendit.dao.IMitarbeiter;
import at.ac.tuwien.ifs.calendit.domain.Mitarbeiter;


/**
 * 
 * The Table model encapsulates the complete data needed for the table in the
 * GUI form. This includes reading the data from the database using the data
 * access object (DAO).
 * 
 * @author The SE-Team
 * @version 1.0
 * 
 */
public class MitarbeiterTableModel extends AbstractTableModel {

	/**
	 * serialVersionUID, generated by eclipse.
	 */
	private static final long serialVersionUID = 8737097029189851737L;

	/**
	 * Retrieves the logger for this class.
	 */
	private static Log log = LogFactory.getLog(MitarbeiterTableModel.class);

	/**
	 * The Data Access Object for Mitarbeiters.
	 */
	private IMitarbeiter mitarbeiterDAO = null;

	/**
	 * Spring Framework XML Bean Factory.
	 */
	private XmlBeanFactory xbf;

	/**
	 * Defines the Names of the Columns of the TableModel.
	 */
	private final String[] columnName = { "ID", "vname",
			"nname", "passwort", "vorgesetzter", "abteilung", "rechte", "krank" };

	/**
	 * The list of Mitarbeiters will be filled by MitarbeiterDAO.
	 */
	private List<Mitarbeiter> mitarbeiter = null;

	/**
	 * Order of the TableModel, must be "Matrikelnummer" or "Nachname".
	 */
	private String order = "";

	/**
	 * Creates a new MitarbeiterenTableModel with default ordering.
	 * 
	 * @param order
	 *            the default Order
	 * @see #order
	 */
	public MitarbeiterTableModel(String order) {
		super();
		ClassPathResource res = new ClassPathResource(Constants.SPRINGBEANS);
		xbf = new XmlBeanFactory(res);
		mitarbeiterDAO = (IMitarbeiter) xbf.getBean("MitarbeiterDAO");
		this.order = order;
		readData();
	}

	/**
	 * Get a List of Mitarbeiters represented in this TableModel.
	 * 
	 * @return the Mitarbeiters represented in the TableModel
	 * @see Mitarbeiter
	 * @see List
	 */
	public List<Mitarbeiter> getMitarbeiteren() {
		return mitarbeiter;
	}

	/**
	 * Returns a single Mitarbeiter out of this TableModel.
	 * 
	 * @param i
	 *            The index of the desired Mitarbeiter.
	 * @return The Mitarbeiter at position <c>i</c>.
	 * @see #getMitarbeiteren()
	 */
	public Mitarbeiter getMitarbeiterAt(int i) {
		return mitarbeiter.get(i);
	}
	
	/**
	 * Returns a single Mitarbeiter out of this TableModel.
	 * 
	 * @param i
	 *            The index of the desired Mitarbeiter.
	 * @return The Mitarbeiter at position <c>i</c>.
	 * @see #getMitarbeiteren()
	 */
	public Mitarbeiter getMitarbeiterWithID(int i) {
		return mitarbeiterDAO.getMitarbeiterById(i);
	}

	/**
	 * Read the Mitarbeiters from the Database with given order.
	 * 
	 * @see MitarbeiterDAO#getMitarbeiters(String)
	 */
	private void readData() {
		mitarbeiter = mitarbeiterDAO.getMitarbeiters(order);
	}

	/**
	 * Reload the Data.
	 */
	public void reload() {
		readData();
		fireTableDataChanged();
	}

	/**
	 * Change the Order and reload the Data.
	 * 
	 * @param order
	 *            the new Order
	 * @see #order
	 */
	public void setOrder(String order) {
		log.info("Order Changed: reading data...");
		this.order = order;
		reload();
	}

	/**
	 * Get the number of rows in this TableModel.
	 * 
	 * @return number of rows
	 */
	public int getRowCount() {
		log.debug("rowcount = " + mitarbeiter.size());
		return mitarbeiter.size();
	}

	/**
	 * Get the number of columns in this TableModel.
	 * 
	 * @return number of colums
	 */
	public int getColumnCount() {
		log.debug("colCount = " + columnName.length);
		return columnName.length;
	}

	/**
	 * Get the title of a column.
	 * 
	 * @param c
	 *            the column-index
	 * @return the title
	 */
	public String getColumnName(int c) {
		log.debug("colName = " + columnName[c]);
		return columnName[c];
	}

	/**
	 * Get the Class of the data saved in a colum.
	 * 
	 * @param c
	 *            the column-index
	 * @return String.class
	 */
	public Class<?> getColumnClass(int c) {
		return String.class;
	}

	/**
	 * Checks whether a cell is editable or not.
	 * 
	 * @param row
	 *            the Row
	 * @param col
	 *            the Column
	 * @return false in any case.
	 */
	public boolean isCellEditable(int row, int col) {
		return false;
	}

	/**
	 * Get the Value from a given Cell, denoted by row and col.
	 * 
	 * @param row
	 *            the Row
	 * @param col
	 *            the Column
	 * @return String containing the value of the cell.
	 */
	public Object getValueAt(int row, int col) {
		log.debug("getValue row = " + row + " col = " + col);
		Mitarbeiter s = mitarbeiter.get(row);
		Mitarbeiter v = mitarbeiterDAO.getMitarbeiterById(s.getVorgesetzter());
		//Mitarbeiter v = mitarbeiterDAO.getMitarbeiterById(1);
		
		switch (col) {
		case 0:
			return "" + s.getId();
		case 1:
			return s.getVname();
		case 2:
			return s.getNname();
		case 3:
			return s.getPasswort();
		case 4:
			return v.getVname() + " " + v.getNname() +" ("+v.getId()+")";
		case 5:
			return s.getAbteilung();
		case 6:
			switch(s.getRechte()){
			case 1: return "MA";
			case 2: return "Chef";
			case 3: return "Admin";
			case 4: return "GF";
			default: return null;
			}
		case 7:
			if (s.isKrank()) return "ja";
			else return "nein";
		default:
			return null;
		}
		
	}
	public boolean insert(Mitarbeiter ma){
		if (mitarbeiterDAO.add(ma)==null)
			return false;
		else
			return true;
	}


}
